package com.lsa.shenn.chap2;

import com.lsa.helpers.Utils;
import com.lsa.shenn.common.perm.PermNoRepeat;
import com.lsa.shenn.common.perm.SetEnumerator;
import com.lsa.shenn.common.perm.SubsetEnumerator;

import junit.framework.TestCase;

public class TestChap2 extends TestCase
{
	public void testSetEnumerator()
	{
		SetEnumerator se = new SetEnumerator(3);
		
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{0,0,0}));		
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{0,0,1}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{0,1,0}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{0,1,1}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{1,0,0}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{1,0,1}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{1,1,0}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), new int[]{1,1,1}));
		assertEquals(true, Utils.compareArrays(se.nextSet(), null));
	}
	
	public void test_2_1_4()
	{
	}
	
	public void test_2_2_1()
	{
		//1 3 5 4 2
		PermNoRepeat pnr = new PermNoRepeat(5);
		int[] set = new int[]{1,3,5,4,2};
		assertEquals(true, Utils.compareArrays(pnr.move2NextSequence(set), new int[]{1, 4, 2, 3, 5}));
	}
	
	public void test_2_2_1_perm_no_repeat()
	{
		PermNoRepeat pnr = new PermNoRepeat(4);
		
		int[][] perms = new int[][]
		                          {new int[]{1,2,3,4}
		                          ,new int[]{1,2,4,3}
		                          ,new int[]{1,3,2,4}
		                          ,new int[]{1,3,4,2}
		                          ,new int[]{1,4,2,3}
		                          ,new int[]{1,4,3,2}
		                          ,new int[]{2,1,3,4}
		                          ,new int[]{2,1,4,3}
		                          ,new int[]{2,3,1,4}
		                          ,new int[]{2,3,4,1}
		                          ,new int[]{2,4,1,3}
		                          ,new int[]{2,4,3,1}
		                          ,new int[]{3,1,2,4}
		                          ,new int[]{3,1,4,2}
		                          ,new int[]{3,2,1,4}
		                          ,new int[]{3,2,4,1}
		                          ,new int[]{3,4,1,2}
		                          ,new int[]{3,4,2,1}
		                          ,new int[]{4,1,2,3}
		                          ,new int[]{4,1,3,2}
		                          ,new int[]{4,2,1,3}
		                          ,new int[]{4,2,3,1}
		                          ,new int[]{4,3,1,2}
		                          ,new int[]{4,3,2,1}
		                          };
		
		int curPerm = 0;
		
		int[] set = null;
		
		set = pnr.move2NextSequence(set);
		while(set != null)
		{
			assertEquals(true, Utils.compareArrays(set, perms[curPerm]));
			set = pnr.move2NextSequence(set);
			curPerm++;
		}
	}
	
	public void test_3_3_1()
	{
		SubsetEnumerator se = new SubsetEnumerator(7,3);
		
		int[] set2 = se.nextSet(new int[]{0, 0, 1, 0, 1, 1, 0});
		Utils.print(set2);
		
		int[] set = se.nextSet(null);
		while(set != null)
		{
			Utils.print(set);
			set = se.nextSet(set);
		}
	}
}
